/***********************************************************************************
 * @ file    : imi_camera_svc.h
 * @ author  : yang yang
 * @ version : 0.9
 * @ date    : 2021.09.20
 * @ brief   :
 * @Copyright (c) 2016  chuangmi inc.
 ************************************************************************************/

#ifndef __IMI_CAMERA_SVC_H__
#define __IMI_CAMERA_SVC_H__

#include "imi_time.h"

typedef struct imi_camera_svc_s *imi_camera_svc_t;

//-------------------------------------------------------------------------------------
// 服务端事件
//-------------------------------------------------------------------------------------
typedef enum {
    SVC_CAM_CLI_UNKNOWN         = 0,
    SVC_CAM_CLI_CONNECTING      = 1,
    SVC_CAM_CLI_CONNECTED       = 2,
    SVC_CAM_CLI_DISCONNECTED    = 3,
    SVC_CAM_CLI_CLOSED          = 4,
} imi_camera_svc_event_t;

//-------------------------------------------------------------------------------------
// 控制指令回调
// @svc:            服务实例
// @session_id      数据所属的session
// @frame_idx       发送数据时系统自动附带的帧号，可以用于判断帧序
// @frame_info      帧头信息
// @info_len        收到的帧头信息长度
// @data            收到的数据指针
// @len             收到的数据长度
// @userdata        注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_svc_media_handler)(
    imi_camera_svc_t svc,
    int session_id,
    int frame_idx,
    int frame_type,
    const char* frame_info,
    int info_len,
    const char* data,
    int len,
    void* userdata);

//-------------------------------------------------------------------------------------
// 控制指令回调
// @svc             服务实例
// @session_id      数据所属的session
// @msg             收到的消息指针
// @msg_len         收到的消息长度
// @userdata        注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_svc_msg_handler)(
    imi_camera_svc_t svc,
    int session_id,
    const char* msg,
    int msg_len,
    void* userdata);


//-------------------------------------------------------------------------------------
// 控制指令回调
// @svc:            服务实例
// @session_id:     数据所属的session
// @evt:            事件类型
// @param:          事件对应的参数（不同的事件有不同的结构体）
// @userdata:       注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_svc_event_handler)(
    imi_camera_svc_t svc,
    int session_id,
    imi_camera_svc_event_t evt,
    void* param,
    void* userdata);

//-------------------------------------------------------------------------------------
// 延迟监控回调
// @svc:            服务实例
// @session_id:     数据所属的session
// @latency:        平均延迟
// @last_time:      持续时间
// @userdata:       注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_svc_latency_handler)(imi_camera_svc_t svc, int session_id,
    imi_timespan_t latency, imi_timespan_t last_time, void *userdata);


#ifdef __cplusplus
extern "C" {
#endif

    //-------------------------------------------------------------------------------------
    // 创建服务实例
    // @media_port:     媒体端口
    // @control_port:   控制端口
    // @token:          登录密码
    // @max_sessions:   支持最大客户端数
    // @return          创建好的服务实例
    //-------------------------------------------------------------------------------------
    imi_camera_svc_t imi_camera_svc_create(int media_port, int control_port,
        const char* token, int max_sessions);

    //-------------------------------------------------------------------------------------
    // 释放服务实例
    // @svc:            服务实例
    //-------------------------------------------------------------------------------------
    void imi_camera_svc_release(imi_camera_svc_t svc);

    //-------------------------------------------------------------------------------------
    // 更新服务登录密码
    // @svc:            服务实例
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_update_token(imi_camera_svc_t svc, const char* token);


    //-------------------------------------------------------------------------------------
    // 设置服务回调
    // @svc:            服务实例
    // @msg_cb:         控制指令回调
    // @media_cb:       媒体数据回调
    // @evt_cb          事件回调
    // @userdata:       userdata，回调时会把该值传回
    //-------------------------------------------------------------------------------------
    void imi_camera_svc_set_callback(
        imi_camera_svc_t svc,
        func_camera_svc_msg_handler msg_cb,
        func_camera_svc_media_handler media_cb,
        func_camera_svc_event_handler evt_cb,
        func_camera_svc_latency_handler latency_cb,
        void *userdata);

    //-------------------------------------------------------------------------------------
    // 启动服务
    // @svc:            服务实例
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_start(imi_camera_svc_t svc);

    //-------------------------------------------------------------------------------------
    // 停止服务
    // @svc:            服务实例
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_stop(imi_camera_svc_t svc);

    //-------------------------------------------------------------------------------------
    // 发送媒体数据
    // @svc             服务实例
    // @session_id      需要发送的session
    // @frame_type      发送的帧类型，可以自行约定。
    // @frame_info      要发送的音视频帧信息
    // @info_len        帧信息长度
    // @data            要发送的音视帧数据
    // @len             要发送的音视频数据长度
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_send_media(
        imi_camera_svc_t svc,
        int session_id,
        int frame_type,
        const char* frame_info,
        int info_len,
        const char* data,
        int len);

    //-------------------------------------------------------------------------------------
    // 发送消息数据
    // @svc             服务实例
    // @session_id      需要发送的session
    // @message         要发送消息信息
    // @len             消息信息长度
    // @return              小于0:错误编码，大于等于0: 发送的序号(data id, 自动产生)
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_send(imi_camera_svc_t svc, int session_id, const char* message, int len);

    //-------------------------------------------------------------------------------------
    // 关闭指定客户端
    // @svc             服务实例
    // @session_id      需要发送的session
    //-------------------------------------------------------------------------------------
    int imi_camera_svc_close(imi_camera_svc_t svc, int session_id);

    //-------------------------------------------------------------------------------------
    // 配置延迟报警参数：延迟到达指定值并持续一段时间后开始报警
    // @svc             服务实例
    // @threshold       延迟达到多少时间开始报警
    // @last_span       延迟持续多久开始报警
    // @interval        报警间隔
    //-------------------------------------------------------------------------------------
    void imi_camera_svc_config_latency(imi_camera_svc_t svc, imi_timespan_t threshold,
         imi_timespan_t last_span, imi_timespan_t interval);

#ifdef __cplusplus
}
#endif

#endif // __IMI_CAMERA_SVC_H__

